﻿Shader "Custom/NewSurfaceShader"
{
    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
		_Normal("Normal", 2D) = "bump" {}
		_ReflectionTex("_ReflectionTex", 2D) = "black" {}
		_FakeReflect("Fake reflection", 2D) = "black" {}
		_DirectionUv("Wet scroll direction (2 samples)", Vector) = (1.0,1.0, -0.2,-0.2)
		_TexAtlasTiling("Tex atlas tiling", Vector) = (8.0,8.0, 4.0,4.0)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        // Physically based Standard lighting model, and enable shadows on all light types
        #pragma surface surf Standard fullforwardshadows

        // Use shader model 3.0 target, to get nicer looking lighting
        #pragma target 3.0

        sampler2D _MainTex;
		sampler2D _ReflectionTex;
		sampler2D _FakeReflect;
		sampler2D _Normal;

        struct Input
        {
            float2 uv_MainTex;
			float4 screenPos;
			float3 worldPos;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;
		half4 _DirectionUv;
		half4 _TexAtlasTiling;

        // Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.
        // See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.
        // #pragma instancing_options assumeuniformscaling
        UNITY_INSTANCING_BUFFER_START(Props)
            // put more per-instance properties here
        UNITY_INSTANCING_BUFFER_END(Props)

		half2 EthansFakeReflection(half3 vtx) 
		{
			half3 worldSpace = vtx;
			worldSpace = (-_WorldSpaceCameraPos * 0.6 + worldSpace) * 0.07;
			return worldSpace.xz;
		}

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            // Albedo comes from a texture tinted by color
			half4  normalScrollUv = IN.uv_MainTex.xyxy * _TexAtlasTiling + _Time.xxxx * _DirectionUv;

			half3 nrml = UnpackNormal(tex2D(_Normal, normalScrollUv.xy));
			nrml += UnpackNormal(tex2D(_Normal, normalScrollUv.zw));
			//nrml.xy *= 0.025;
			fixed4 rtRefl = tex2D(_ReflectionTex, (IN.screenPos.xy / IN.screenPos.w)) *0.3;
			rtRefl += tex2D(_FakeReflect, EthansFakeReflection(IN.worldPos) + nrml.xy * 2.0);

            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color + rtRefl;
            o.Albedo = c.rgb;
			//o.Normal = nrml;
            // Metallic and smoothness come from slider variables
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}
